/*
 * 人员部件模型 - 人员内容部件定义
 * 
 * 主要功能：
 * - 定义人员内容部件的数据结构
 * - 提供人员信息的存储模型
 * - 演示内容部件的使用
 * - 支持人员数据的序列化
 */

using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentManagement;
using System;

namespace Lombiq.TrainingDemo.Models;

/// <summary>
/// 人员部件模型 - 定义人员内容部件的数据结构
/// 
/// 主要用途：
/// - 定义人员内容部件的数据结构
 //* - 提供人员信息的存储模型
 //* - 演示内容部件的使用
 //* - 支持人员数据的序列化
 //* 
 //* 使用场景：
/// - 存储人员的基本信息
/// - 作为内容项的一部分
/// - 支持人员数据的查询和显示
/// - 提供人员信息的统一格式
/// 
/// 设计原因：
/// - 为人员数据提供统一的数据结构
/// - 简化人员信息的存储和传输
/// - 支持人员数据的序列化
/// - 提供可扩展的人员数据模型
/// 
/// 设计模式：
/// - 部件模式：继承ContentPart实现内容部件
/// - 属性模式：使用简单属性存储数据
/// - 序列化模式：支持数据序列化
/// - 内容模式：作为内容项的一部分
/// </summary>
// 现在让我们看看Orchard Core在存储数据时提供了什么实践。这里您可以看到一个内容部件。
// 每个内容部件可以附加到一个或多个内容类型。从内容类型您可以创建内容项（所以您有点"实例化"
// 内容类型作为内容项）。这是Orchard Core内容管理的最重要部分。
//
// 这里是一个PersonPart，包含一个人的一些属性。我们计划将此内容部件附加到Person内容类型，
// 所以当您创建Person内容项时，它将有一个PersonPart附加到它。您还需要在服务提供程序中注册此类（请参阅：Startup.cs）。
public class PersonPart : ContentPart
{
    /// <summary>
    /// 姓名 - 人员姓名信息
    /// 
    /// 功能说明：
    /// - 存储人员的姓名
    /// - 支持多语言内容
    /// - 用于人员标识
    /// - 提供用户友好的显示
    /// 
    /// 序列化说明：
    /// - ContentPart被序列化为JSON对象
    /// - 创建属性时需要记住这一点
    /// - 详细信息请参阅Json.NET文档：https://www.newtonsoft.com/json/help/html/Introduction.htm
    /// </summary>
    // ContentPart被序列化为JSON对象，所以在创建属性时需要记住这一点。
    // 更多信息请查看Json.NET文档：https://www.newtonsoft.com/json/help/html/Introduction.htm
    public string Name { get; set; }

    /// <summary>
    /// 惯用手 - 人员惯用手信息
    /// 
    /// 功能说明：
    /// - 存储人员的惯用手信息
    /// - 使用枚举类型确保类型安全
    /// - 用于人员特征描述
    /// - 支持统计分析
    /// </summary>
    public Handedness Handedness { get; set; }

    /// <summary>
    /// 出生日期 - 人员出生日期信息
    /// 
    /// 功能说明：
    /// - 存储人员的出生日期
    /// - 支持日期计算（如年龄）
    /// - 用于人员信息管理
    /// - 提供时间相关的功能
    /// 
    /// 数据类型：
    /// - 使用DateTime?支持可空日期
    /// - 支持UTC时间存储
    /// - 便于时区处理
    /// </summary>
    public DateTime? BirthDateUtc { get; set; }

    /// <summary>
    /// 传记 - 人员传记信息
    /// 
    /// 功能说明：
    /// - 存储人员的详细传记信息
    /// - 使用TextField支持富文本
    /// - 用于人员详细描述
    /// - 支持长文本内容
    /// 
    /// 字段特性：
    /// - 继承自TextField
    /// - 支持富文本编辑
    /// - 可配置显示选项
    /// - 支持内容验证
    /// 
    /// 使用说明：
    /// - 这是内容字段。内容字段类似于内容部件，但字段是更小的组件，
    /// - 封装了单个数据的简单编辑器和显示。内容部件可以提供更复杂的功能，
    /// - 也可以包含一组字段。TextField是Orchard众多内置字段之一。
    /// - 要使用它，您不需要为部件添加属性（您只需要将其附加到内容类型，
    /// - 我们从迁移中这样做），但拥有这样的属性是它的一个很好的快捷方式。
    /// - 您也不需要实例化它，我们在这里这样做是为了避免在处理内容项时进行空检查，
    /// - 即使没有使用IContentManager.LoadAsync()初始化它。
    /// </summary>
    // 这是内容字段。内容字段类似于内容部件，但字段是更小的组件，
    // 封装了单个数据的简单编辑器和显示。内容部件可以提供更复杂的功能，
    // 也可以包含一组字段。TextField是Orchard众多内置字段之一。
    // 要使用它，您不需要为部件添加属性（您只需要将其附加到内容类型，
    // 我们从迁移中这样做），但拥有这样的属性是它的一个很好的快捷方式。
    // 您也不需要实例化它，我们在这里这样做是为了避免在处理内容项时进行空检查，
    // 即使没有使用IContentManager.LoadAsync()初始化它。
    public TextField Biography { get; set; } = new();
}

/// <summary>
/// 惯用手枚举 - 定义人员的惯用手类型
/// 
/// 主要用途：
/// - 定义人员的惯用手类型
 //* - 提供类型安全的枚举值
 //* - 支持统计分析功能
 //* - 提供统一的惯用手分类
 //* 
 //* 使用场景：
/// - 人员信息管理
/// - 统计分析
/// - 数据筛选
/// - 用户界面显示
/// 
/// 设计原因：
/// - 提供类型安全的惯用手分类
/// - 支持数据验证和筛选
/// - 便于统计分析
/// - 提供统一的分类标准
/// 
/// 设计模式：
/// - 枚举模式：使用枚举定义固定值
/// - 类型安全模式：提供编译时类型检查
/// - 分类模式：提供统一的分类标准
/// </summary>
public enum Handedness
{
    /// <summary>
    /// 右手 - 惯用右手
    /// </summary>
    Right,

    /// <summary>
    /// 左手 - 惯用左手
    /// </summary>
    Left,
}

// 下一站：Migrations/PersonMigrations
